/* Controlador para generar el ticket
 Creado por Carlos Pastelin Morales 
 29/12/2014 */
package Controlador;

import Vistas.Interface;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.Doc;
import javax.print.PrintException;

public class Ticket {
    /*Inicializamos las variables a utilizar*/
    public String fecha = "", hora = "", fechayhora = "", contentTicket;
    public Object productos, precio, cant;
    public String cadenita = "";
    public String pro = "";
    private Interface vista;

//El constructor genera el Molde de el ticket
    public Ticket(Interface view) {
    this.vista = view;
    obtenerfecha();
    obtenerproductos();
    contentTicket = "\t::" + (char) 27 + (char) 112 + (char) 0 + (char) 10 + (char) 100 
            +""+vista.jNombreEmpresa.getText()+"::\n"
            +"RFC:"+vista.jRfc.getText()+"\n"
            +fechayhora+"\n"
            +vista.jDireccion.getText()+"\n"
            +"Tel."+vista.jNumTel.getText()+"\n"
          //+”EXPEDIDO EN: {{expedition}}\n”+  
          //  ing.San Jose de abajo calle 6 av
            +"================================\n"
            // + // “Periban. Mich. {{dateTime}}\n”+
            +"Caja # 1 "
            +"Nota #"+vista.jNumVenta.getText()+"\n"
            +"Numero de empreado:"+vista.jTIDVenta.getText()+"\n"
            +"================================\n"
            +"Cant.       Nombre        Precio\n"
            +"================================\n"  //15   9999999.22
            +cadenita+"\n"
            +"================================\n"
   //         + "SUBTOTAL: {{subTotal}}\n"
   //         + "IVA: {{tax}}\n"
            +"TOTAL: $"+vista.jTtotal.getText()+"\n\n"
            //”RECIBIDO: {{recibo}}\n”+
             //”CAMBIO: {{change}}\n\n”+
            +"================================\n"
            + "     GRACIAS POR SU COMPRA\n"
            + " ESPERAMOS SU VISITA NUEVAMENTE\n"
            + "\t::"+vista.jNombreEmpresa.getText()+"::\n"
            + "\n"
            + "\n\n\n ";      
     //   this.contentTicket = this.contentTicket.replace("{{nameLocal}}", nameLocal);
    }

    public void print() throws IOException {
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); //nos da el array de los servicios de impresion
//Creamos un arreglo de tipo byte
//y le agregamos el string convertido (cuerpo del ticket) a bytes tal como
//lo maneja la impresora(mas bien ticketera :p)
        byte[] bytes = this.contentTicket.getBytes();

//Especificamos el tipo de dato a imprimir
//Tipo: bytes; Subtipo: autodetectado
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;

        Doc doc = new SimpleDoc(bytes, flavor, null);
//Creamos un trabajo de impresión
        DocPrintJob job = null;
        if (services.length > 0) {
            for (int i = 0; i < services.length; i++) {//PDF24 PDF     GP-5890X Series
                if (services[i].getName().equals("GP-5890X Series")) {//aqui escribimos/elegimos la impresora por la que queremos imprimir
                    job = services[i].createPrintJob();// System.out.println(i+”: “+services[i].getName());
                }
            }
        }

//Imprimimos dentro de un try obligatoriamente
        try {
            job.print(doc, null);
        } catch (PrintException ex) {
            System.out.println(ex);
        }
    }
    public void obtenerfecha() {
        Date date = new Date();
//Caso 1: obtener la hora y salida por pantalla con formato:
        DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
        hora="Hora: " + hourFormat.format(date);
//Caso 2: obtener la fecha y salida por pantalla con formato:
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        fecha="Fecha: " + dateFormat.format(date);
//Caso 3: obtenerhora y fecha y salida por pantalla con formato:
        DateFormat hourdateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
        fechayhora=hourdateFormat.format(date);

    }
    /*Metodo par obteneer los producto de la venta para su impresion*/
    public void obtenerproductos(){
        try{
            for (int k = 0; k < vista.Tlista.getRowCount(); k++) {//C.P.M recorremos la tabla de la venta
                   cant=vista.Tlista.getValueAt(k, 0);//C.P.M oobtenemos la cantidad
                   productos=vista.Tlista.getValueAt(k, 1);//C.P.M el producto
                   pro = objectToString(productos);//C.P.M pasamos de objeto a string
                   precio=vista.Tlista.getValueAt(k, 2);//C.P.M obtenemos el precio 
                  if(pro.length()>17){//C.P.M preguntamos si el nombre del producto es mayor a 17
                     pro = pro.substring(0, 17);//C.P.M si es mayor lo cortamos a un tamano de 17
                  }
                  for (int i = 17; i > pro.length();) {//C.P.M de lo contrario si es menor lo recorremos y agregamos espacios para alinear al molde del ticket
                      pro=pro+" ";
                  }
                  for (int i = 4; 4 > cant.toString().length();) {//C.P.M recorremos la cantidad para amolt=darla a el ticket
                      cant=cant+" ";
                  }
                  for (int i = 9; 9 > precio.toString().length();) {//C.P.M lo mismo para el precio
                      precio=" "+precio;
                  }
                  cadenita = cadenita+cant+" "+pro+" "+precio+"\n";//C.P.M asqui generamos la linea de un producto dentro de la cadena
            }
            }catch(Exception e1){
                  JOptionPane.showMessageDialog(null,"No se puedieron obtener los datos de la venta");
                  }             
                    
    }
    /*Metodo para pasar de un objeto a string*/
    public String objectToString(Object o) {
        String st;
        st = (String) o;
        return st;
    }
}